public class Leetcode {
}

//leetcode:746:使用最小花费爬楼梯
class Solution1 {
    public int minCostClimbingStairs(int[] cost) {
        int n = cost.length;
        int[] dp = new int[n+1];

        for(int i = 2; i <= n; i++){
            dp[i] = Math.min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]);
        }
        return dp[n];
    }
}

//leetcode:91:解码方法
class Solution2 {
    public int numDecodings(String s) {
        char[] arr = s.toCharArray();
        int n = arr.length;
        int[] dp = new int[n];
        //如果第一位数不为0，就让此位置的解码数加一
        if (arr[0] != '0') dp[0] = 1;
        //如果只有一位直接返回
        if (n == 1) return dp[0];

        //如果第二位和第一位都不为0，让此时第二位解码数量加一
        if (arr[0] != '0' && arr[1] != '0') dp[1]++;
        //如果他还能与前一位组成10~26之间的数就代表此时还是一位解码
        int t = (arr[0] - '0') * 10 + arr[1] - '0';
        if (t >= 10 && t <= 26) dp[1]++;

        //如果接下来的数依然不为0，就代表他能和它前一位的解码数量组合此时它前面的解码数量就是他的数量
        for (int i = 2; i < n; i++) {
            if (arr[i] != '0') dp[i] += dp[i - 1];
            //如果他还能与前一位组成10~26之间的数就代表此时还是一位解码，那么他们前面的解码数量也是他的解码数量
            int tt = (arr[i - 1] - '0') * 10 + arr[i] - '0';
            if (tt >= 10 && tt <= 26) dp[i] += dp[i - 2];
            //最后加在一起的结果就是这个位置总的解码量
        }
        return dp[n - 1];
    }
}